home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / mm / mm-0.90 / mailrc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-12-18  |  2.6 KB  |  121 lines

  1. /*
  2.  * Copyright (c) 1986, 1990 by The Trustees of Columbia University in
  3.  * the City of New York.  Permission is granted to any individual or
  4.  * institution to use, copy, or redistribute this software so long as it
  5.  * is not sold for profit, provided this copyright notice is retained.
  6.  */
  7.  
  8. #ifndef lint
  9. static char *rcsid = "$Header: /f/src2/encore.bin/cucca/mm/tarring-it-up/RCS/mailrc.c,v 2.2 90/10/04 18:24:39 melissa Exp $";
  10. #endif
  11.  
  12. #include "mm.h"
  13. #include "address.h"
  14.  
  15. mailrc()
  16. {
  17.     FILE *fp;
  18.     char fname[BUFSIZ];
  19.  
  20.     sprintf(fname, "%s/.mailrc", HOME);
  21.     if  ((fp = fopen(fname, "r")) == NULL)
  22.     return;
  23.     rdmailrc(fp);
  24.     fclose(fp);
  25. }
  26.     
  27. rdmailrc(fp) 
  28. FILE *fp;
  29. {
  30.     char line[BUFSIZ];
  31.     char alias[40];
  32.     addresslist al;
  33.     char *cp, *cp1, *gettoken(), *egets();
  34.     addresslist *a, *lookup_alias();
  35.  
  36.     while(egets(line, BUFSIZ-1, fp) != NULL) {
  37.     al.first = al.last = nil;
  38.     line[BUFSIZ-1] = '\0';
  39.     cp = line;
  40.  
  41.     cp1 = gettoken(&cp);
  42.     if (cp1 == nil)
  43.         continue;
  44.     if (ustrncmp(cp1,"alias",5))
  45.         continue;
  46.  
  47.     cp1 = gettoken(&cp);
  48.     if (cp1 == nil)
  49.         continue;
  50.     strcpy(alias, cp1);
  51.     while(cp1 = gettoken(&cp)) {
  52.         if (a = lookup_alias(cp1))
  53.         merge_addresses(&al, a);
  54.         else
  55.         add_addresslist(&al, cp1, ADR_ADDRESS);
  56.     }
  57.     if (al.first)
  58.         set_alias(safe_strcpy(alias), &al, MA_MAILRC);
  59.     }
  60. }
  61.  
  62.  
  63. /*
  64.  * get a "token" -- a "word" or a quoted string
  65.  */
  66.  
  67. char *
  68. gettoken(cp) 
  69. char **cp;
  70. {
  71.     static char buf[BUFSIZ];
  72.     char *cp1;
  73.  
  74.     for(cp1 = *cp; isspace(*cp1) && *cp1 != '\0'; cp1++);
  75.     *cp = cp1;
  76.     if (*cp1 == '"') {            /* quoted string */
  77.     for(cp1 = *cp+1; *cp1 != '"' && *cp1 != '\0'; cp1++)
  78.         if ((*cp1 == '\\') && *(cp1+1) != '\0')
  79.         cp1++;            /* ignore " if it's next */
  80.     cp1++;                /* include " */
  81.     }
  82.     else
  83.     for(cp1 = *cp; !isspace(*cp1) && *cp1 != '\0'; cp1++);
  84.     if (*cp == cp1)
  85.     return(nil);
  86.     strncpy(buf,*cp, cp1- *cp);
  87.     buf[cp1- *cp] = '\0';
  88.     *cp = cp1;
  89.     return(buf);
  90. }
  91.  
  92. /*
  93.  * egets:
  94.  * like fgets, but if line ends in "\", get next line
  95.  */
  96.  
  97. char *
  98. egets (s, n, stream)
  99. char *s;
  100. int n;                    /* max length */
  101. FILE *stream;
  102. {
  103.     int left, len;
  104.     char *str;
  105.  
  106.     left = n; str = s;            /* haven't read anything yet */
  107.  
  108.     while (true) {
  109.     if (fgets (str, left, stream) == NULL)
  110.         return (NULL);        /* -sigh- */
  111.     len = strlen (str);
  112.     if ((len < 2) ||        /* didn't get backslash-lf */
  113.         (str[len - 1] != '\n') ||    /* no lf -- out of space so done */
  114.         (str[len - 2] != '\\'))    /* not continued */
  115.         return (s);
  116.     str[len - 2] = ' ';        /* translate backslash-lf to space */
  117.     str[len - 1] = '\0';        /* just in case... */
  118.     str = &(str[len-1]);        /* continue after the space */
  119.     }
  120. }
  121.